/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package br.DAO;

import br.Modelo.Usuario;

import java.util.List;
import java.util.ArrayList;

import javax.swing.JOptionPane;

import java.sql.Connection;
import java.sql.Statement;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;




/**
 *
 * @author ItaloLopes
 */

public class UsuarioDAO {
    
     
     public static void Salvar(Usuario usuario)
     {
         Connection conexao = FabricaConexao.GeraConexao();
         
         PreparedStatement insereSt = null;
         
         String sql = ("insert into usuario(CODIGO_USU, NOME_USU, LOGIN_USU, SENHA_USU, DATACADASTRO_USU) "
                 + "values(?,?,?,?,?)");
         
         try
         {
             insereSt = conexao.prepareStatement(sql);
             //insereSt.setInt(1, usuario.getIdUsuario());
             insereSt.setInt(1, PegaProximoCodigo());
             insereSt.setString(3, usuario.getLoginUsuario());
             insereSt.setString(2, usuario.getNomeUsuario());
             insereSt.setString(4, usuario.getSenhaUsuario());
             if(usuario.getCadastroUsuario() == null)
                 insereSt.setTimestamp(5, new java.sql.Timestamp(new java.util.Date().getTime()));
             else
                 insereSt.setTimestamp(5, usuario.getCadastroUsuario());
             insereSt.executeUpdate();
         }
         catch(SQLException e)
         {
             JOptionPane.showMessageDialog(null, "Erro ao incluir usuario: " + e.getMessage());
         }
         finally
         {
             try
             {
                 insereSt.close();
                 conexao.close();
             }
             catch(Throwable e)
             {
                 JOptionPane.showMessageDialog(null, "Erro ao fechar conexão" + e.getMessage());
             }
         }
     }
     
     public static void Alterar(Usuario usuario)
     {
         Connection conexao = FabricaConexao.GeraConexao();
         
         PreparedStatement insereSt = null;
         
         String sql = ("UPDATE usuario SET CODIGO_USU = ?, NOME_USU = ?, LOGIN_USU = ?, SENHA_USU = ?, DATACADASTRO_USU = ? WHERE CODIGO_USU = ?");
         
         try
         {
             insereSt = conexao.prepareStatement(sql);
             //insereSt.setInt(1, PegaProximoCodigo());
             insereSt.setInt(1, usuario.getIdUsuario());
             insereSt.setString(3, usuario.getLoginUsuario());
             insereSt.setString(2, usuario.getNomeUsuario());
             insereSt.setString(4, usuario.getSenhaUsuario());
             
             insereSt.setTimestamp(5, usuario.getCadastroUsuario());
             insereSt.setInt(6, usuario.getIdUsuario());
             insereSt.executeUpdate();
         }
         catch(SQLException e)
         {
             System.out.println("Erro ao alterar usuario: " + e.getMessage());
         }
         finally
         {
             try
             {
                 insereSt.close();
                 conexao.close();
             }
             catch(Throwable e)
             {
                 System.out.println("Erro ao fechar conexão: " + e.getMessage());
             }
         }
     }
     
     public static void Excluir(Usuario usuario)
     {
         Connection conexao = FabricaConexao.GeraConexao();
         
         PreparedStatement insereSt = null;
         
         String sql = ("DELETE FROM usuario WHERE CODIGO_USU = ?");
         
         try
         {
             insereSt = conexao.prepareStatement(sql);
             insereSt.setInt(1, usuario.getIdUsuario());
             insereSt.executeUpdate();
         }
         catch(SQLException e)
         {
             System.out.println("Erro ao excluir usuario: " + e.getMessage());
         }
         finally
         {
             try
             {
                 insereSt.close();
                 conexao.close();
             }
             catch(Throwable e)
             {
                 JOptionPane.showMessageDialog(null, "Erro ao fechar a conexão" + e.getMessage());
             }
         }
     }
     
     public static int PegaProximoCodigo()
     {
         Connection conexao = FabricaConexao.GeraConexao();
         
         Statement consulta = null;
         ResultSet resultado = null;
         int ProximoCodigo = 1;
         
         String sql = "SELECT MAX(codigo_usu) AS maior_codigo FROM USUARIO;";
         
         try
         {
             consulta = (Statement)conexao.createStatement();
             resultado = consulta.executeQuery(sql);
             
             resultado.next();
             ProximoCodigo = resultado.getInt("maior_codigo");
             ProximoCodigo++;
         }
         catch(SQLException e)
         {
             //JOptionPane.showMessageDialog(null, "Erro na execução da função PegaProximoCodigo" + e.getMessage());
         }
         finally
         {
             try
             {
                 consulta.close();
                 resultado.close();
                 conexao.close();
             }
             catch(Throwable e)
             {
                 //JOptionPane.showMessageDialog(null,"Erro ao fechar a conexão" + e.getMessage());
             }
             finally
             {
                 return ProximoCodigo;
             }
         }
     }
     
     public static Usuario RecuperaObjetoId(int ID)
     {
         Connection conexao = FabricaConexao.GeraConexao();
         
         Usuario usuarioRecuperado = new Usuario();
         PreparedStatement consulta = null;
         ResultSet resultado = null;
         
         String sql = "SELECT * FROM usuario WHERE codigo_usu = ?";
         
         try
         {
             consulta = conexao.prepareStatement(sql);
             consulta.setInt(1, ID);
             resultado = consulta.executeQuery();
             
             resultado.next();
             
             usuarioRecuperado.setIdUsuario(resultado.getInt("codigo_usu"));
             usuarioRecuperado.setNomeUsuario(resultado.getString("nome_usu"));
             usuarioRecuperado.setLoginUsuario(resultado.getString("login_usu"));
             usuarioRecuperado.setSenhaUsuario(resultado.getString("senha_usu"));
             usuarioRecuperado.setCadastroUsuario(resultado.getTimestamp("datacadastro_usu"));
             
             
         }
         catch(SQLException e)
         {
             System.out.println("Erro ao recuperar usuario" + e.getMessage());
         }
         finally
         {
             try
             {
                 consulta.close();
                 resultado.close();
                 conexao.close();
             }
             catch(Throwable e)
             {
                 System.out.println("Erro ao fechar conexão com o BD" + e.getMessage());
             }
             finally
             {
                 return usuarioRecuperado;
             }
         }
     }
     
      
      public static List<Usuario> ListarUsuarios(String Nome)
      {
          Connection conexao = FabricaConexao.GeraConexao();
          
          List<Usuario> usuario = new ArrayList<Usuario>();
          Statement consulta = null;
          ResultSet resultado = null;
          
          String sql = "SELECT * FROM usuario ";
          sql = sql + "WHERE NOME_USU like '%" + Nome + "%'";
          
          try
          {
              consulta = (Statement)conexao.createStatement();
              resultado = consulta.executeQuery(sql);
              
              while(resultado.next())
              {
                  Usuario usuarioTemp = new Usuario();
                  usuarioTemp.setIdUsuario(resultado.getInt("codigo_usu"));
                  usuarioTemp.setNomeUsuario(resultado.getString("nome_usu"));
                  usuarioTemp.setLoginUsuario(resultado.getString("login_usu"));
                  usuarioTemp.setSenhaUsuario(resultado.getString("senha_usu"));
                  usuarioTemp.setCadastroUsuario(resultado.getTimestamp("datacadastro_usu"));
                  usuario.add(usuarioTemp);
              }
          }
          catch(SQLException e)
          {
              System.out.println("Erro ao recuperar usuarios: " + e.getMessage());
          }
          finally
          {
              try
              {
                  consulta.close();
                  resultado.close();
                  conexao.close();
              }
              catch(Throwable e)
              {
                  System.out.println("Erro ao fechar a conexão: " + e.getMessage());
              }
              finally
              {
                  return usuario;
              }
          }
          
      }
      
      private static final int cnstNavPri = 0;
      private static final int cnstNavAnt = 1;
      private static final  int cnstNavProx = 2;
      private static final int cnstNavUlt = 3;
      
      
      public static String SQLNavegacao(int pOpcao, int pCodigoAtual)
      {
          String SQL = "";
          switch(pOpcao)
          {
              case cnstNavPri:
                  SQL = "SELECT MIN(codigo_usu) AS cod FROM usuario";
                  break;
              case cnstNavAnt:
                  SQL = "SELECT MAX(codigo_usu) AS cod FROM usuario WHERE codigo_usu < " + String.valueOf(pCodigoAtual);
                  break;
              case cnstNavProx:
                  SQL = "SELECT MIN(codigo_usu) AS cod FROM usuario WHERE codigo_usu > " + String.valueOf(pCodigoAtual);
                  break;
              case cnstNavUlt:
                  SQL = "SELECT MAX(codigo_usu) AS cod FROM usuario";
                  break;
          }
          return SQL;
      }
      
      public static int PegaCodigoPelaNavegacao(int pOpcao, int pCodigoAtual)
      {
          Connection conexao = FabricaConexao.GeraConexao();
          Statement consulta = null;
          ResultSet resultado = null;
          int CodigoEncontrado = -1;
          
          try{
              consulta = (Statement)conexao.createStatement();
              resultado = consulta.executeQuery(SQLNavegacao(pOpcao, pCodigoAtual));
              
              resultado.next();
              CodigoEncontrado = resultado.getInt("cod");
          }
          catch(Exception e){
              JOptionPane.showMessageDialog(null, "Erro ao executar sql de navegação: " + e.getMessage());
          }
          finally{
              try{
                  consulta.close();
                  conexao.close();
              }
              catch(Throwable e){
                  JOptionPane.showMessageDialog(null, "Erro ao fechar conexão com o BD: " + e.getMessage());
              }
          }
          
          return CodigoEncontrado;
      }
      
      public static ArrayList<Usuario> PesquisaObjeto(String sCampo, String sValor, boolean bTodaParte){
          String sql = "SELECT * FROM Usuario WHERE " +  sCampo;
          if(bTodaParte){
              sql = sql + " like '%";
            sql = sql + sValor + "%'";
          }
          else
          {
              sql = sql + " = '" + sValor + "'";
          }
          System.out.println(sql);
          
          return RecuperaObjetos(sql);
      }
      
      private static ArrayList<Usuario> RecuperaObjetos(String sql){
          Connection conexao = FabricaConexao.GeraConexao();
          Usuario usu;
          
          ArrayList<Usuario> usuario = new ArrayList<Usuario>();
          Statement consulta = null;
          ResultSet resultado = null;
          
          try
          {
              consulta = (Statement)conexao.createStatement();
              resultado = consulta.executeQuery(sql);
              
              while(resultado.next())
              {
                  Usuario UsuarioTemp = new Usuario();
                  UsuarioTemp.setIdUsuario(resultado.getInt("Codigo_usu"));
                  UsuarioTemp.setNomeUsuario(resultado.getString("nome_usu"));
                  UsuarioTemp.setLoginUsuario(resultado.getString("login_usu"));
                  UsuarioTemp.setSenhaUsuario(resultado.getString("senha_usu"));
                  UsuarioTemp.setCadastroUsuario(resultado.getTimestamp("datacadastro_usu"));
                  usuario.add(UsuarioTemp);
              }
          }
          catch(SQLException e)
          {
              System.out.println("Erro ao recuperar usuarios: " + e.getMessage());
          }
          finally
          {
              try
              {
                  consulta.close();
                  resultado.close();
                  conexao.close();
              }
              catch(Throwable e)
              {
                  System.out.println("Erro ao fechar a conexão: " + e.getMessage());
              }
              finally
              {
                  return usuario;
              }
          }
      }
      
}
